Salbutamol is a short-acting beta-agonist (SABA) which acts on the smooth muscle surrounding the bronchi. By inhibiting smooth muscle contraction, it induces bronchodilation which relieves asthma symptoms(1). Salbutamol is the most commonly prescribed inhaler in Scotland
This report aims to investigate the trends regarding prescribing of salbutamol in Scotland in the year 2024. With a focus on variations across the different NHS Health Boards, and across different seasons throughout the year.
It is imortant to consider the influence of these factors on the prescribing of salbutamol, as
Across the NHS Health Boards, we would expect a greater number of total prescriptions in health boards with a greater overall population. If we look at data
First we load in data files for the prescriptions in each month of 2024. We also load in data for the NHS Health Boards:
data_jan_jun_2024 <- read_csv("https://www.opendata.nhs.scot/dataset/84393984-14e9-4b0d-a797-b288db64d088/resource/f0df380b-3f9b-4536-bb87-569e189b727a/download/hb_pitc2024_01_06-1.csv") %>%
clean_names()
data_jul_dec_2024 <- read_csv("https://www.opendata.nhs.scot/dataset/84393984-14e9-4b0d-a797-b288db64d088/resource/f3b9f2e2-66c0-4310-9b8e-734781d2ed0a/download/hb_pitc2024_07_12-1.csv") %>%
clean_names()
HB_lookup <- read_csv("https://www.opendata.nhs.scot/dataset/9f942fdb-e59e-44f5-b534-d6e17229cc7b/resource/652ff726-e676-4a20-abda-435b98dd7bdc/download/hb14_hb19.csv") %>%
clean_names()
combined_data_2024 <- bind_rows(data_jan_jun_2024, data_jul_dec_2024) %>%
clean_names() %>%
full_join(HB_lookup, by = c("hbt" = "hb")) %>%
select(hb_name, hbt:paid_date_month) %>%
filter(!is.na(hb_name))
NHS_healthboards <- st_read(here("data", "SG_NHS_HealthBoards_2019.shp"))
## Reading layer `SG_NHS_HealthBoards_2019' from data source
## `C:\Users\saimc\OneDrive\Documents\data-science\B249238\data\SG_NHS_HealthBoards_2019.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 14 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 5512.998 ymin: 530250.8 xmax: 470332 ymax: 1220302
## Projected CRS: OSGB36 / British National Grid
population_data <- read_csv(here( "data", "UV102a_age_health_board_census.csv"), skip = 10) %>%
# Rename the last column to avoid the messy name in column 6
# and to match column names with the prescription dataset
rename(Spare = "...6",
hb_name = "Health Board Area 2019",
hb_population = Count) %>%
# filter the data so that we get the population of the entire health board
filter(Age == "All people" & Sex == "All people") %>%
# select only the relevant columns
select(hb_name, hb_population) %>%
# change health board names so they match the prescription data
mutate(hb_name = paste("NHS", hb_name))
salbutamol_inhalers <- c("SALBUTAMOL", "AIROMIR", "ASMALAL", "SALAMOL", "SALBULIN", "VENTOLIN")
salbutamol_data <- combined_data_2024 %>%
filter(str_detect(bnf_item_description, paste(salbutamol_inhalers, collapse = "|")))
All of the data files were used to produce the following results consisting of a summary table, line graphs and maps.
salbutamol_data_table <- population_data %>%
full_join(salbutamol_data,
by = join_by(hb_name)) %>%
group_by(hb_name, hb_population) %>%
summarise(
number_of_paid_items = sum(number_of_paid_items),
paid_quantity = sum(paid_quantity),
quantity_per_head = sum(paid_quantity)/mean(hb_population)
) %>%
ungroup() %>%
gt() %>%
tab_header(
title = "Prescription of Salbutamol across NHS Health Boards"
) %>%
tab_source_note(
source_note = "Source: ********"
) %>%
cols_label(
hb_name = "Health Board",
hb_population = "Health Board Population",
number_of_paid_items = "Total Number of Paid Items",
paid_quantity = "Total Paid Quantity",
quantity_per_head = "Salbutamol Dispensed Per Person"
) %>%
opt_stylize()
salbutamol_data_table
| Prescription of Salbutamol across NHS Health Boards | ||||
| Health Board | Health Board Population | Total Number of Paid Items | Total Paid Quantity | Salbutamol Dispensed Per Person |
|---|---|---|---|---|
| NHS Ayrshire and Arran | 365256 | 185756 | 43075166 | 117.93144 |
| NHS Borders | 116821 | 54322 | 13283784 | 113.71058 |
| NHS Dumfries and Galloway | 145895 | 89894 | 20207703 | 138.50854 |
| NHS Fife | 371781 | 165797 | 45429068 | 122.19309 |
| NHS Forth Valley | 302784 | 129151 | 33998863 | 112.28752 |
| NHS Grampian | 581040 | 200258 | 47438608 | 81.64431 |
| NHS Greater Glasgow and Clyde | 1177213 | 607721 | 144018885 | 122.33885 |
| NHS Highland | 321321 | 134030 | 32197816 | 100.20452 |
| NHS Lanarkshire | 668027 | 367261 | 82929044 | 124.14026 |
| NHS Lothian | 904628 | 319072 | 80087331 | 88.53068 |
| NHS Orkney | 21958 | 6775 | 1546281 | 70.41994 |
| NHS Shetland | 22986 | 8118 | 1776140 | 77.27051 |
| NHS Tayside | 413992 | 173873 | 46495792 | 112.31085 |
| NHS Western Isles | 26140 | 13045 | 2957459 | 113.13921 |
| Source: ******** | ||||
seasonal_salbutamol_prescriptions <- salbutamol_data %>%
mutate(season = case_when(paid_date_month %in% c(202403, 202404, 202405) ~ "Spring", paid_date_month %in% c(202406, 202407, 202408) ~ "Summer", paid_date_month %in% c(202409, 202410, 202411) ~ "Autumn", paid_date_month %in% c(202412, 202401, 202402) ~ "Winter"), season = factor(season, levels = c("Spring", "Summer", "Autumn", "Winter"))) %>%
group_by(hb_name, season) %>%
summarise(avg_paid_quantity = mean(paid_quantity, na.rm = TRUE))
line_graph <- ggplot(seasonal_salbutamol_prescriptions, aes(x = season, y = avg_paid_quantity, group = hb_name)) +
geom_line(color = "darkgreen", linewidth = 1) +
geom_point() +
facet_wrap(~ hb_name, ncol = 3, scales = "free") +
labs(x = "Season", y = "Average Quantity per Season", title = "Seasonal Salbutamol Prescribing by Health Board") +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 10))
plotly::ggplotly(line_graph)
These graphs above show the variations in monthly prescribing of salbutamol throughout 2024 for each of the Health boards in Scotland
For the future, I plan to produce similar graphs for other beta-blockers and maybe also graphs for all beta-blockers combined. It might also be useful for me to include a summary table of prescribing of beta-blockers across health boards.
Regarding seasonal changes, I could divide the 12 months into 4 seasons (3 months data combined for total data for each season) but I need to investigate the best way to present the data across seasons.
If I end up having too many graphs, I might decide to only have graphs for data regarding all beta-blockers combined rather than specific beta-blockers like salbutamol.
salbutamol_data_hb <- NHS_healthboards %>%
full_join(salbutamol_data,
by = join_by(HBCode == hbt)) %>%
filter(!is.na(HBName)) %>%
group_by(HBCode) %>%
summarise(paid_quantity = sum(paid_quantity))
map_salbutamol_data_hb <- salbutamol_data_hb %>%
ggplot(aes(fill = paid_quantity)) +
geom_sf(colour = "black", size = 0.1) +
scale_fill_distiller(
palette = "Blues",
direction = 1,
name = "No. of Prescriptions"
) +
labs(
title = "Total Number of Salbutamol Prescriptions",
subtitle = "Salbutamol Prescriptions by Health Board"
) +
theme_void() +
theme(
plot.title = element_text(face = "bold", size = 16),
plot.subtitle = element_text(size = 8)
)
map_salbutamol_data_hb
Include Limitations of data and next steps (particularly in terms of data that would allow for further analysis)
However, there are some limitations in the data used in this report. For instance,
Regarding potential next steps, it would be useful
1.Marques L, Vale N. Salbutamol in the management of asthma: A review. International Journal of Molecular Sciences [Internet]. 2022;23(22). Available from: https://pmc.ncbi.nlm.nih.gov/articles/PMC9696300/